package main

import (
	"fmt"
	"math"
	"sort"
	"time"
)

type Area interface {
	area() float32
}

type Graph struct{}

// 三角形结构体
type Triangle struct {
	Graph
	lenth, high float32
}

// 圆形结构体
type Round struct {
	Graph
	rad float32
}

// 长方形结构体
type Rect struct {
	Graph
	lenth, wid float32
}

func (p *Triangle) area() float32 {
	area := p.lenth * p.high / 2
	return area
}

func (p *Round) area() float32 {
	area := float32(math.Pi * math.Pow(float64(p.rad), 2))
	return area
}

func (p *Rect) area() float32 {
	area := p.lenth * p.wid
	return area
}

// 多态实现
func area(a Area) float32 {
	return a.area()
}

// 用于map排序结构体
type gras struct {
	name Area
	area float32
}

// 时间作业题
var longweekd = []string{
	"周日", "周一", "周二", "周三", "周四", "周五", "周六",
}

type Timeday struct {
	year, seconds, month, day int
}

func (p Timeday) Cal() time.Time {
	tz, _ := time.LoadLocation("Asia/Shanghai")
	layout := "2006/1/02 03:04:05"
	newt := fmt.Sprintf("%v/%v/%v %v:%v:%v", p.year, p.month, p.day, "09", "30", "00")
	newtime, _ := time.ParseInLocation(layout, newt, tz)
	return newtime
}

func main() {
	// 三角形初始化实例并赋值
	t0 := new(Triangle)
	t0.lenth = 3
	t0.high = 6.9
	// 圆形初始化实例并赋值
	ro0 := new(Round)
	ro0.rad = 3.5
	// 长方形初始化实例并赋值
	re0 := new(Rect)
	re0.lenth = 13.6
	re0.wid = 17
	// 分别求各个图形的面积
	fmt.Println("~~~~~~~第一题~~~~~~~~~")
	fmt.Printf("%v\n", area(t0))
	fmt.Printf("%v\n", area(ro0))
	fmt.Printf("%v\n", area(re0))

	// 对以上图形面积排序
	m0 := make(map[Area]float32, 100)
	m0[t0] = area(t0)
	m0[ro0] = area(ro0)
	m0[re0] = area(re0)
	slis := make([]gras, 3)
	i := 0
	for k, v := range m0 {
		slis[i] = gras{k, v}
		i++
	}
	fmt.Println("~~~~~~~~第二题~~~~~~~~")
	fmt.Printf("排序前: %v\n", slis)
	sort.Slice(slis, func(i, j int) bool {
		return slis[i].area < slis[j].area
	})
	fmt.Printf("排序后: %v\n", slis)

	// 时间
	t := time.Now()
	fmt.Println("~~~第四题~~(第三题在上一周)~~")
	fmt.Printf("当前时间是：%v\n", t)
	t1 := new(Timeday)
	t1.year = t.Year() - 8
	t1.seconds = t.Second()
	t1.month = int(t.Month())
	t1.day = t.Day()
	t2 := t1.Cal()
	fmt.Printf("8年前的今天上午9点30分是: %v\n", t2)
	fmt.Printf("毫秒时间戳是: %v\n", t2.UnixMilli())
	fmt.Printf("格式化打印: %v\n", t2.Format("2006/01/02 15:04:06 +0800"))
	fmt.Printf("那天是%v\n", longweekd[(int(t2.Weekday()))])
	_, w := t2.ISOWeek()
	fmt.Printf("本年已经过了%v周\n", w)
	fmt.Printf("距离今天已经过了%.f天了", t.Sub(t2).Hours()/24)
}

// 阿飞老师的批改
// 实现逻辑清晰，结果正确，特别是最后周几的中文显示，很用心，但还存在一些小问题：
// 1. 第二题思路正确，但是要求倒序，是从大到小。注意看清需求；
// 2. 面积的小数显示，如果要显示小数，小数位数尽量要统一。
